package cc.rengu.igas.bsps.core.service.trans;

import cc.rengu.igas.bsps.common.dao.BspsMchntBaseInfoMapper;
import cc.rengu.igas.bsps.common.dao.BspsTxnStatisMapper;
import cc.rengu.igas.bsps.common.dao.impl.BspsMchntBaseInfoMapperImpl;
import cc.rengu.igas.bsps.common.dao.impl.BspsTxnStatisMapperImpl;
import cc.rengu.igas.bsps.common.entity.MchntBaseInfo;
import cc.rengu.igas.bsps.common.entity.TxnStatis;
import cc.rengu.igas.bsps.common.enums.QueryTypeEnum;
import cc.rengu.igas.bsps.common.enums.RespCodeEnum;
import cc.rengu.igas.bsps.common.enums.TxnTypeEnum;
import cc.rengu.igas.bsps.core.service.base.ManageService;
import cc.rengu.igas.bsps.facade.bean.MchntTransStatisInfoBean;
import cc.rengu.igas.bsps.facade.request.MchntTransStatisInfoQueryRequest;
import cc.rengu.igas.bsps.facade.response.MchntTransStatisInfoQueryResponse;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.utility.util.AmountUtil;
import cc.rengu.oltp.utility.util.ConvertUtil;
import cc.rengu.oltp.utility.util.StringUtil;

import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author zhangxuran
 * @version 1.0
 * @date 2020/04/10
 */
public class MchntTransStatisInfoQueryService extends ManageService {
    private String instId;

    @Override
    protected Object bizBeforeCust() throws Exception {
        MchntTransStatisInfoQueryRequest mchntTransStatisInfoQueryRequest = new MchntTransStatisInfoQueryRequest();
        ConvertUtil.convertOutput(mchntTransStatisInfoQueryRequest);
        return mchntTransStatisInfoQueryRequest;
    }

    @Override
    protected BizResponse bizProcessCust(Object request) throws Exception {
        MchntTransStatisInfoQueryRequest mchntTransStatisInfoQueryRequest = (MchntTransStatisInfoQueryRequest) request;
        /*获取请求参数：法人行号，用户标识，查询类型，查询主体，开始日期，截止日期，交易金额起始值、截止值，交易笔数起始值、截止值*/
        this.instId = mchntTransStatisInfoQueryRequest.getHeader().getInstId();
        String queryType = mchntTransStatisInfoQueryRequest.getQueryType();
        String queryId = mchntTransStatisInfoQueryRequest.getQueryId();
        String startDate = mchntTransStatisInfoQueryRequest.getStartDate();
        String endDate = mchntTransStatisInfoQueryRequest.getEndDate();
        String transAmtStart = mchntTransStatisInfoQueryRequest.getTransAmtStart();
        String transAmtEnd = mchntTransStatisInfoQueryRequest.getTransAmtEnd();
        String transNumStart = mchntTransStatisInfoQueryRequest.getTransNumStart();
        String transNumEnd = mchntTransStatisInfoQueryRequest.getTransNumEnd();
        /*必填性校验*/
        if (StringUtil.isEmptyOrNull(queryType) || StringUtil.isEmptyOrNull(queryId) || StringUtil.isEmptyOrNull(startDate) || StringUtil.isEmptyOrNull(endDate)) {
            rglog.error("商户交易信息统计请求参数必填性校验失败");
            throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
        }
        /*根据查询类型和查询主体查询统计商户交易信息*/
        TxnStatis txnStatis = new TxnStatis();
        txnStatis.setInstId(instId);
        /*查询开始时间赋值*/
        txnStatis.setStatisDate(startDate);
        /*查询截止时间赋值*/
        txnStatis.setRemark3(endDate);
        /*交易类型赋值*/
        txnStatis.setTxnType(TxnTypeEnum.PAY_TYPE.getTxnType());
        /*根据查询类型赋值查询主体*/
        if (QueryTypeEnum.MCHNT_QUERY_TYPE.getQueryTypeCode().equals(queryType)) {
            /*商户主体查询*/
            txnStatis.setMchntNo(queryId);
        } else if (QueryTypeEnum.MANAGER_QYERY_TYPE.getQueryTypeCode().equals(queryType)) {
            /*拓展经理主体查询*/
            txnStatis.setManagerId(queryId);
        } else if (QueryTypeEnum.PLAT_MCHNT_QYERY_TYPE.getQueryTypeCode().equals(queryType)) {
            /*平台商户主体查询*/
            txnStatis.setPlatMchntNo(queryId);
        } else if (QueryTypeEnum.GROUP_MCHNT_QYERY_TYPE.getQueryTypeCode().equals(queryType)) {
            /*集团商户主体查询*/
            txnStatis.setGroupMchntNo(queryId);
        } else if (QueryTypeEnum.AGENT_MCHNT_QYERY_TYPE.getQueryTypeCode().equals(queryType)) {
            /*代理商户主体查询*/
            txnStatis.setAgentMchntNo(queryId);
        } else {
            rglog.error("查询类型参数非法");
            throw new BizException(RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespCode(), RespCodeEnum.MSG_VALID_CHECK_ERROR.getRespDesc());
        }
        BspsTxnStatisMapper bspsTxnStatisMapper = new BspsTxnStatisMapperImpl();
        List<TxnStatis> txStatisList = bspsTxnStatisMapper.selectBspsMchntTransStatisInfoByQueryIdAndDate(instId, txnStatis);
        /*条件过滤*/
        if (null != txStatisList && !txStatisList.isEmpty()) {
            if (!StringUtil.isEmptyOrNull(transAmtStart)) {
                /*根据交易金额起始值过滤*/
                txStatisList = txStatisList.stream().filter(item -> AmountUtil.compare(item.getTotalTransAmt(), transAmtStart) >= 0).collect(Collectors.toList());
            }
            if (!StringUtil.isEmptyOrNull(transAmtEnd)) {
                /*根据交易金额截止值过滤*/
                txStatisList = txStatisList.stream().filter(item -> AmountUtil.compare(item.getTotalTransAmt(), transAmtEnd) <= 0).collect(Collectors.toList());
            }
            if (!StringUtil.isEmptyOrNull(transNumStart)) {
                /*根据交易笔数截止值过滤*/
                txStatisList = txStatisList.stream().filter(item -> AmountUtil.compare(item.getTotalTransNum(), transNumStart) >= 0).collect(Collectors.toList());
            }
            if (!StringUtil.isEmptyOrNull(transNumEnd)) {
                /*根据交易笔数截止值过滤*/
                txStatisList = txStatisList.stream().filter(item -> AmountUtil.compare(item.getTotalTransNum(), transNumEnd) <= 0).collect(Collectors.toList());
            }
        }
        List<MchntTransStatisInfoBean> mchntTransStatisInfoList = new ArrayList<>();
        /*信息转换*/
        if (null != txStatisList && !txStatisList.isEmpty()) {
            txStatisList.forEach(item -> convMchntTransStatis(item, mchntTransStatisInfoList));
        }
        /*组织返回报文*/
        MchntTransStatisInfoQueryResponse mchntTransStatisInfoQueryResponse = new MchntTransStatisInfoQueryResponse();
        mchntTransStatisInfoQueryResponse.setMchntTransStatisInfoList(mchntTransStatisInfoList);
        BizResponse<MchntTransStatisInfoQueryResponse> bizResponse = new BizResponse<>();
        bizResponse.setRspSysId(AppParamConstant.SYS_ID);
        bizResponse.setRespCode(RespCodeEnum.TRANS_SUCCESS.getRespCode());
        bizResponse.setRespDesc(RespCodeEnum.TRANS_SUCCESS.getRespDesc());
        bizResponse.setResult(mchntTransStatisInfoQueryResponse);
        return bizResponse;
    }

    /**
     * 商户交易统计信息转换
     * txnStatis 商户交易统计信息
     **/
    private void convMchntTransStatis(TxnStatis txnStatis, List<MchntTransStatisInfoBean> mchntTransStatisInfoList) {
        try {
            MchntTransStatisInfoBean mchntTransStatisInfo = new MchntTransStatisInfoBean();
            /*交易总金额赋值*/
            if (!StringUtil.isEmptyOrNull(txnStatis.getTotalTransAmt())) {
                mchntTransStatisInfo.setTransTotalAmt(new BigDecimal(txnStatis.getTotalTransAmt()).toString());
            }
            /*交易总笔数赋值*/
            mchntTransStatisInfo.setTransTotalNum(txnStatis.getTotalTransNum());
            /*笔均交易金额赋值*/
            if (!StringUtil.isEmptyOrNull(txnStatis.getTotalTransAmt()) && !StringUtil.isEmptyOrNull(txnStatis.getTotalTransNum())) {
                mchntTransStatisInfo.setAverageTransAmt(AmountUtil.division(txnStatis.getTotalTransAmt(), txnStatis.getTotalTransNum(), 2));
            }
            /*商户号赋值*/
            mchntTransStatisInfo.setMchntNo(txnStatis.getMchntNo());
            /*根据商户号查询商户基本信息*/
            BspsMchntBaseInfoMapper bspsMchntBaseInfoMapper = new BspsMchntBaseInfoMapperImpl();
            MchntBaseInfo mchntBaseInfo = bspsMchntBaseInfoMapper.selectBspsMchntBaseInfoByPrimaryKey(instId, txnStatis.getMchntNo());
            if (null != mchntBaseInfo) {
                /*商户名赋值*/
                mchntTransStatisInfo.setMchntName(mchntBaseInfo.getMchntName());
                /*商户类型赋值*/
                mchntTransStatisInfo.setMchntType(mchntBaseInfo.getMchntType());
                /*商户状态赋值*/
                mchntTransStatisInfo.setMchntStatus(mchntBaseInfo.getMchntStatus());
            }
            mchntTransStatisInfoList.add(mchntTransStatisInfo);
        } catch (Exception e) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            e.printStackTrace(new PrintWriter(byteArrayOutputStream, true));
            rglog.error("商户交易统计列表信息转换失败:{}", byteArrayOutputStream.toString());
        }
    }

    @Override
    protected void bizAfterCust(Object response) throws Exception {
        BizResponse bizResponse = (BizResponse) response;
        MchntTransStatisInfoQueryResponse mchntTransStatisInfoQueryResponse = (MchntTransStatisInfoQueryResponse) bizResponse.getResult();
        ConvertUtil.convertInput(mchntTransStatisInfoQueryResponse);
    }
}
